#include "LinkTree.h"
#include <stdio.h>
#include <MyString.h>

#define GetNode(str) FindLinkTreeNode(tree,(void*)str,IsNameContains)

void Print(void *ptr)
{
    printf("%s\n",(char*)ptr);
}

bool IsNameContains(void *ptr1,void *ptr2)
{
    INSERTSTR(str,(char*)ptr1);
    return IsEqual(&str,(char*)ptr2);
}

TNode *FindNodeByPath(LTree *tree,const char *path)
{
    //切割路径
    MyStrList strList = Split(path,"/");
    //遍历字符串
    TNode *target = GetTreeRoot(tree);
    for(int i = 0; i < strList.len; i++)
    {
        target = FindChildNode(target,(void*)strList.StringList[i].string,IsNameContains);
        if(target == NULL)
        {
            printf("没找到!\n");
            return NULL;
        }
    }
    return target;
}

int main()
{
    LTree *tree = InitLinkTree();

    TNode* class1 = CreateTreeNode("251");
    TNode* class2 = CreateTreeNode("252");
    ConnectBranch(GetTreeRoot(tree),class1);
    ConnectBranch(GetTreeRoot(tree),class2);
    // 路径: 251/第一组
    //      252/第一组
    ConnectBranch(GetNode("251"),CreateTreeNode("第一组"));
    ConnectBranch(GetNode("251"),CreateTreeNode("第二组"));
    ConnectBranch(GetNode("252"),CreateTreeNode("第一组"));
    ConnectBranch(GetNode("252"),CreateTreeNode("第二组"));

    ConnectBranch(FindNodeByPath(tree,"251/第一组"),CreateTreeNode("张三"));

    ConnectBranch(FindNodeByPath(tree,"251/第二组"),CreateTreeNode("李四"));

    ConnectBranch(FindNodeByPath(tree,"252/第一组"),CreateTreeNode("王五"));

    ConnectBranch(FindNodeByPath(tree,"252/第二组"),CreateTreeNode("六子"));

    // TNode* stu1 = CreateTreeNode("张三");
    // TNode* stu2 = CreateTreeNode("李四");
    // ConnectBranch(class1,stu1);
    // ConnectBranch(class1,stu2);

    // TNode* stu3 = CreateTreeNode("王五");
    // TNode* stu4 = CreateTreeNode("六子");
    // ConnectBranch(class2,stu3);
    // ConnectBranch(class2,stu4);

    // DisconnectBranch(class1,stu1);
    // ConnectBranch(class2,stu1);
    TravelTree(tree,Print);

    // TNode *n = FindLinkTreeNode(tree,(void*)"张",IsNameContains);
    // if(n != NULL)
    // {
    //     printf("找到的姓张的同学:%s\n",(char*)GetTreeNodeData(n));
    // }

    DLlist leaves = FindAllLeafBranches(tree);

    printf("叶子:\n");
    DLNode *TravelPoint = leaves.head->next;
    while(TravelPoint != NULL)
    {
        TNode *n = (TNode*)TravelPoint->data;
        Print(GetTreeNodeData(n));
        TravelPoint = TravelPoint->next;
    }
    printf("树的高度 : %d\n",GetTreeHeight(tree));
    
    ClearLinkTree(tree);
}

// #include "LinkTree.h"
// #include <stdio.h>
// #include <dirent.h>
// #include <string.h>
// #include <MyString.h>

// void ExploreDirectory(const char *path,TNode *node)
// {
//     //文件夹结构体
//     //打开一个文件夹,获取文件夹指针
//     DIR *d = opendir(path);
//     if(d == NULL)
//         return;
    
//     struct dirent *e = NULL;
//     //依次读文件夹里的文件,读完返回空
//     while((e = readdir(d)) != NULL)
//     {
//         //排除"."当前路径和".."上层路径
//         if(strcmp(e->d_name,".") == 0 || strcmp(e->d_name,"..") == 0)
//         {
//             continue;
//         }

//         //根据文件名创建一个新节点  path和noed是同级的,e是path的子目录,所以fileNode是node的子节点
//         TNode* fileNode = CreateTreeNode(GetString(e->d_name).string);
//         ConnectBranch(node,fileNode);

//         //文件类型是4代表是文件夹
//         if(e->d_type == 4)
//         {
//             //当前路径为上层路径+"/"+自己
//             char filePath[1024] = {0};
//             strcpy(filePath,path);
//             strcat(filePath,"/");
//             strcat(filePath,e->d_name);
//             ExploreDirectory(filePath,fileNode);
//         }
//     }
//     closedir(d);
// }

// void Print(void *ptr)
// {
//     printf("%s\n",(char*)ptr);
// }

// int main(int argc,char *argv[])
// {
//     if(argc != 1 && argc != 2)
//     {
//         printf("invalid value!\n");
//         return -1;
//     }

//     char *path = NULL;
//     if(argc == 1)
//     {
//         path = "./";
//     }
//     else
//     {
//         path = argv[1];
//     }

//     LTree *t = InitLinkTree();

//     TNode *pathNode = CreateTreeNode(path);
//     ConnectBranch(GetTreeRoot(t),pathNode);

//     ExploreDirectory(path,pathNode);

//     TravelTree(t,Print);
//     ClearLinkTree(t);
//     return 0;
// }